package com.web.controller.ctg;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import com.generico.dao.ctg.CtgCatalogoDao;
import com.generico.dao.ctg.CtgProductoDao;
import com.generico.dao.ctg.CtgSucursalDao;
import com.generico.dto.ctg.CtgProducto;
import com.generico.dto.ctg.CtgSubTipoSucursal;
import com.generico.dto.ctg.CtgSucursal;
import com.generico.dto.ctg.CtgTipoSucursal;
import com.generico.exception.AsiWebException;
import com.main.controller.BaseController;
import com.main.java.DocumentoAdjunto;
import com.main.service.DocumentoAdjuntoService;
import com.web.util.GenericoUtil;


@Controller
@RequestMapping("/ctgProducto")
public class CtgProductoController extends BaseController {

	@Autowired
	private CtgProductoDao ctgProductoDao;
	
	@Autowired
	private CtgCatalogoDao ctgCatalogoDao;

	@Autowired
	private DocumentoAdjuntoService documentoAdjuntoService;
	
	private static Long uploadMaxSize;
	
	@RequestMapping(value = "/view")
	public String view(HttpServletRequest request, ModelMap model){
		try {
			model.put("userName", GenericoUtil.getUserName());
			model.put("usuarioId", GenericoUtil.getSgdUsuarioIdFromAcegi());
			model.put("ctgProductos", JSONArray.fromObject(ctgProductoDao.getAllActivesAsArray()));
			model.put("ctgColor", JSONArray.fromObject(ctgCatalogoDao.findAllActivesAsArray(GenericoUtil.CTG_COLORES)));
			model.put("ctgMaterialCortina", JSONArray.fromObject(ctgCatalogoDao.findAllActivesAsArray(GenericoUtil.CTG_MATERIAL_CORTINA)));
			model.put("ctgMaterialAlfombra", JSONArray.fromObject(ctgCatalogoDao.findAllActivesAsArray(GenericoUtil.CTG_MATERIAL_ALFOMBRA)));
			model.put("ctgTamanioCortina", JSONArray.fromObject(ctgCatalogoDao.findAllActivesAsArray(GenericoUtil.CTG_TAMANIO_CORTINA)));
			model.put("ctgTamanioAlfombra", JSONArray.fromObject(ctgCatalogoDao.findAllActivesAsArray(GenericoUtil.CTG_TAMANIO_ALFOMBRA)));
			model.put("ctgGarantia", JSONArray.fromObject(ctgCatalogoDao.findAllActivesAsArray(GenericoUtil.CTG_GARANTIA)));
		} catch (NumberFormatException e) {
			logger.error("Exception: ", e);
		} catch (Exception e) {
			logger.error("Exception: ", e);
		}
		return "admin/ctg/ctgProducto";
	}

	
	@RequestMapping(value = "/save", method = {RequestMethod.POST})
	public void save(HttpServletResponse response,
			@ModelAttribute(value = "ctgProducto") CtgProducto ctgProducto,
			@RequestParam(value="uploadFile") CommonsMultipartFile uploadFile) {
		Map<String, Object> result = new HashMap<String, Object>();
		try{
			
			
			
			if(ctgProducto != null){
				result = ctgProductoDao.guardarCtgProducto(ctgProducto, getKycUploadMaxSize(), uploadFile);
				result.put("ctgProductoId", ctgProducto.getCtgProductoId());
				result.put(SUCCESS, true);
				result.put(MESSAGE, "Datos Actualizados");
				List<Object[]> list = ctgProductoDao.getAllActivesAsArray();
				for (int index = 0; index < list.size(); index++) {
					if(ctgProducto.getCtgProductoId().equals(list.get(index)[0])){
						result.put("ctgProductoIndex", index);
						break;
					}
				}
				result.put("ctgProductos", JSONArray.fromObject(list));
			}else{
				result.put(FAILURE, true);
				result.put(MESSAGE, GenericoUtil.ERROR_MESSAGE);
			}
		}catch(Exception e){
			result.put(FAILURE, true);
			result.put(MESSAGE, GenericoUtil.getExceptionMessage(e));
		}
		serializeObject(result, response);
	}
	
	@RequestMapping(value = "/delete", method = {RequestMethod.POST})
	public void delete(HttpServletResponse response,
			@RequestParam Long ctgProductoId) {
		Map<String, Object> result = new HashMap<String, Object>();
		try{
			ctgProductoDao.eliminarCtgProducto(ctgProductoId);
			result.put(SUCCESS, true);
			result.put(MESSAGE, "Dato Producto Eliminado");
			result.put("ctgProductos", JSONArray.fromObject(ctgProductoDao.getAllActivesAsArray()));
		}catch(Exception e){
			result.put(FAILURE, true);
			result.put(MESSAGE, GenericoUtil.getExceptionMessage(e));
		}
		serializeObject(result, response);
	}
	
	private Long getKycUploadMaxSize(){
		if(uploadMaxSize == null) uploadMaxSize = Long.valueOf(GenericoUtil.trimToZero(GenericoUtil.FILE_UPLOAD_MAX_SIZE));
		return uploadMaxSize;
	}

	
	@RequestMapping(value = "/viewProductoImagen", method = {RequestMethod.GET, RequestMethod.POST})
	public void viewFile(HttpServletResponse response, @RequestParam("codigo") String codigo) {
		try {
			Long ctgProductoId = new Long(StringUtils.defaultIfEmpty(codigo, "0"));
			List<CtgProducto> ctgProductoIma = ctgProductoDao.getCtgProductos(ctgProductoId);
			if (!GenericoUtil.isEmptyList(ctgProductoIma)) {
				for (CtgProducto prodImage : ctgProductoIma) {
					
					if (prodImage == null || prodImage.getCtgProductoImage() == null || prodImage.getCtgProductoImage().length == 0) {
						response.getWriter().write("<h1>DOCUMENTO NO ENCONTRADO</h1>");
						return;
					}
					byte[] archivo = prodImage.getCtgProductoImage();

					response.setHeader("Content-Length", String.valueOf(archivo.length));

					response.setContentType("image/jpg");

					ServletOutputStream out = response.getOutputStream();
					ByteArrayInputStream bais = new ByteArrayInputStream(archivo);

					byte[] outputByte = new byte[2048];
					while (bais.read(outputByte, 0, 2048) != -1) out.write(outputByte, 0, 2048);
					bais.close();
					out.flush();
					out.close();
					
				}
			}
			
			
			
			
			
			
		} catch (Exception e) {
			logger.error("Problemas recuperando informacion de Imagen", e);
			try {
				response.setContentType("text/html");
				response.getWriter().write("<h1>DOCUMENTO NO ENCONTRADO</h1>");
			} catch (IOException e1) {
				logger.error("Error", e1);
			}
		}
	}
//	@RequestMapping(value = "/readDepto")
//	public void read(HttpServletRequest request,HttpServletResponse response,
//			@PathVariable String filtro1,
//			@PathVariable String filtro2){
//		try
//		{
//			String jsonString = DBContext.getCtgProvinciaDao().findAllActivesAsArray().toString();
//			serializeString(jsonString, response);
//		}catch(Exception e)
//		{
//
//		}
//	}



//	@RequestMapping(value = "/create")
//	public void create(HttpServletRequest request, HttpServletResponse response, ModelMap model,
//			@ModelAttribute("ctgSucursal") CtgSucursal ctgSucursal,
//			@ModelAttribute("ctgSubTipoSucursal") CtgSubTipoSucursal ctgSubTipoSucursal,
//			@ModelAttribute("ctgTipoSucursal") CtgTipoSucursal ctgTipoSucursal
//			){
//		Map<String, Object> result = new HashMap<String, Object>();
//		try {
//			if(request.getParameter("tipo").toString().equalsIgnoreCase("3"))
//				ctgSucursalDao.saveSucursal(ctgSucursal);
//			if(request.getParameter("tipo").toString().equalsIgnoreCase("2")){
//				ctgSucursalDao.saveSucursal(ctgSubTipoSucursal);
//			}
//			if(request.getParameter("tipo").toString().equalsIgnoreCase("1"))
//				ctgSucursalDao.saveSucursal(ctgTipoSucursal);
//			result.put(MESSAGE, "Informaci&oacute;n Ingresada");
//			result.put(SUCCESS, true);
//
//		result.put("ctgTipoSucursal", JSONArray.fromObject(ctgSucursalDao.findTipoSucursalAllAsArray()));
//		result.put("ctgSubTipoSucursal", JSONArray.fromObject(ctgSucursalDao.findAllSubTipoSucursalAllAsArray()));
//		result.put("ctgSucursal", JSONArray.fromObject(ctgSucursalDao.findAllSucursalAllAsArray()));
//		}
//		catch (AsiWebException e) {
//			result.put(FAILURE, true);
//			result.put(MESSAGE, GenericoUtil.getExceptionMessage(e));
//			logger.error(e, e);
//		}catch (Exception e) {
//			result.put(FAILURE, true);
//			result.put(MESSAGE, GenericoUtil.ERROR_MESSAGE);
//			logger.error(e, e);
//		}
//		serializeObject(result, response);
//	}
//
//	@RequestMapping(value = "/update")
//	public void update(HttpServletRequest request, HttpServletResponse response,ModelMap model,
//			@ModelAttribute("ctgSucursal") CtgSucursal ctgSucursal,
//			@ModelAttribute("ctgSubTipoSucursal") CtgSubTipoSucursal ctgSubTipoSucursal,
//			@ModelAttribute("ctgTipoSucursal") CtgTipoSucursal ctgTipoSucursal
//			){
//		Map<String, Object> result = new HashMap<String, Object>();
//		try {
//			if(request.getParameter("tipo").toString().equalsIgnoreCase("3"))
//				ctgSucursalDao.updateSucursal(ctgSucursal);
//			if(request.getParameter("tipo").toString().equalsIgnoreCase("2"))
//				ctgSucursalDao.updateSucursal(ctgSubTipoSucursal);
//			if(request.getParameter("tipo").toString().equalsIgnoreCase("1"))
//				ctgSucursalDao.updateSucursal(ctgTipoSucursal);
//			result.put(MESSAGE, "Informaci&oacute;n Actualizada");
//			result.put(SUCCESS, true);
//
//		result.put("ctgTipoSucursal", JSONArray.fromObject(ctgSucursalDao.findTipoSucursalAllAsArray()));
//		result.put("ctgSubTipoSucursal", JSONArray.fromObject(ctgSucursalDao.findAllSubTipoSucursalAllAsArray()));
//		result.put("ctgSucursal", JSONArray.fromObject(ctgSucursalDao.findAllSucursalAllAsArray()));
//
//		}
//		catch (AsiWebException e) {
//			result.put(FAILURE, true);
//			result.put(MESSAGE, GenericoUtil.getExceptionMessage(e));
//			logger.error(e, e);
//		}catch (Exception e) {
//			result.put(FAILURE, true);
//			result.put(MESSAGE, GenericoUtil.ERROR_MESSAGE);
//			logger.error(e, e);
//		}
//		serializeObject(result, response);
//	}
//
//
//	@RequestMapping(value = "/delete")
//	public void delete(HttpServletRequest request,HttpServletResponse response, ModelMap model,
//			@ModelAttribute("ctgSucursal") CtgSucursal ctgSucursal,
//			@ModelAttribute("ctgSubTipoSucursal") CtgSubTipoSucursal ctgSubTipoSucursal,
//			@ModelAttribute("ctgTipoSucursal") CtgTipoSucursal ctgTipoSucursal
//			){
//		Map<String, Object> result = new HashMap<String, Object>();
//		try {
//			if(request.getParameter("tipo").toString().equalsIgnoreCase("3"))
//				ctgSucursalDao.deleteSucursal(ctgSucursal);
//			if(request.getParameter("tipo").toString().equalsIgnoreCase("2"))
//				ctgSucursalDao.deleteSucursal(ctgSubTipoSucursal);
//			if(request.getParameter("tipo").toString().equalsIgnoreCase("1"))
//				ctgSucursalDao.deleteSucursal(ctgTipoSucursal);
//			result.put(MESSAGE, "Informaci&oacute;n Eliminada");
//			result.put(SUCCESS, true);
//			result.put("ctgTipoSucursal", JSONArray.fromObject(ctgSucursalDao.findTipoSucursalAllAsArray()));
//			result.put("ctgSubTipoSucursal", JSONArray.fromObject(ctgSucursalDao.findAllSubTipoSucursalAllAsArray()));
//			result.put("ctgSucursal", JSONArray.fromObject(ctgSucursalDao.findAllSucursalAllAsArray()));
//
//
//		}
//		catch (AsiWebException e) {
//			result.put(FAILURE, true);
//			result.put(MESSAGE, GenericoUtil.getExceptionMessage(e));
//			logger.error(e, e);
//		}catch (Exception e) {
//			result.put(FAILURE, true);
//			result.put(MESSAGE, "Registro no puede ser eliminado porque se encuentra asociado a una sucursal o usuario");
//			logger.error(e, e);
//		}
//		serializeObject(result, response);
//	}

}
